#include "list.h"
#include "Element_data.h"
#include"file.h"

// 编写 增 删 改 查 打印 的函数


// 顺序表的初始化：    动态分配内存 创建一个 班级 将len 等于 0
void Init_Sql_List(sq_list *L)
{
    // L = (sq_list *)malloc(MAX_SIZE*sizeof(sq_list));
    L->len = 0;
}

// 顺序表的插入：尾插 
void tail_insert_list(sq_list *L, stu data)
{
    // 安全判断
    if (L == NULL || !IsFull_Sql_List(L))
    {
        printf("表为NULL或已满,无法添加用户\n");
        return;
    }
    // IsFull_Sql_List(L);
    // 第一步传值
    // L->data[Line_Num] = data;
    // int i = Line_Num - 1;
    L->data[Line_Num] = data;
    // int i = 0;
    // printf("%d\t\t%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n", Line_Num, L->data[i].name, L->data[i].sex, L->data[i].age, L->data[i].id, L->data[i].grade);
    // 第二步修改len
    // L->len++;
    // fflush(stdout);
}

// 顺序表的删除：尾删
void tail_del_list(sq_list *L)
{
    // 接收文件中数据
    L = use_users(L, file_path);
    IsEmpty_Sql_List(L);

    //先打印删除信息
    printf("你删除了%s的信息!\n", L->data[Line_Num - 1].name);
    find_by_name(L, L->data[Line_Num - 1].name);
    
    // 覆盖写入到本地文件
    save_users(L, file_path, "w+", Line_Num - 1);
    // L->len--;
}

// 顺序表的查找：按名字查找并输出其全部信息,返回其位置i
int find_by_name(sq_list *L, char *name)
{
    //接收文件中数据
    L = use_users(L,file_path);
    for (int i = 0; i < Line_Num; i++)
    {
        if (!strcmp(L->data[i].name,name))
        {//找到则打印并返回i
            printf("|序号\t|名字\t|性别\t|学号\t|年龄\t|成绩\t|\n");
            printf("|%d\t|%s\t|%s\t|%d\t|%d\t|%d\t|\n",
                   i + 1, L->data[i].name, L->data[i].sex, L->data[i].id, L->data[i].age, L->data[i].grade);
            return i;
        }
    }
    printf("查不到%s的信息!\n", name);
}

// 顺序表的遍历(从文件中)：
void printf_Sql_List(sq_list *L)
{
    //接收文件中的数据
    L = use_users(L,file_path);
    printf("序号\t\t|名字\t\t|性别\t\t|年龄\t\t|学号\t\t|成绩\n");

    // 打印到终端,第一行不用打印
    for (int i = 0; i < Line_Num; i++)
    {
        printf("%d\t\t%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n",i+1, L->data[i].name, L->data[i].sex, L->data[i].age, L->data[i].id, L->data[i].grade);
    }
}

// 顺序表的判空：
int IsEmpty_Sql_List(sq_list *L)
{
    if (Line_Num == 0)
    {
        printf("表的数据为空!\n");
        return 0;
    }
    else if (L == NULL)
    {
        printf("表为NULL\n");
        return 0;
    }
    else
        return 1;
}

// 顺序表的判满：
int IsFull_Sql_List(sq_list *L)
{
    // 接收文件中的数据
    // L = use_users(L, file_path);
    if (Line_Num >= MAX_SIZE)
    {
        printf("学生表的数据已经满了!\n");
        return 0;
    }
    else
        return 1;
}

// 顺序表的清空：
void Clear_Sql_List(sq_list *L)
{
    // 清空直接覆盖写0个数据
    save_users(L, file_path, "w+", 0);
    // L->len = 0;
    printf("顺序表已清空!\n");
}

void IS_continue()
{
    int contiue_flag;
    printf("按任意数字继续:");
    scanf("%d", &contiue_flag);
    // if (contiue_flag == 0)
    // {
    //     return;
    // }
}

// 通过用户名查找删除(按值查找删除)
void byname_delete(sq_list *L)
{
    // 接收文件中的数据
    // L = use_users(L, file_path);
    char my_name[36];              // 用户接收用户输入的姓名
    printf("请输入你需要删除的学生:");
    scanf("%s", my_name);
    int i = find_by_name(L, my_name); // 先找到该用户的位置

    // 后面的数据依次往前移，覆盖掉位置为i的数据
    for (int j = i; j < Line_Num; j++)
    {
        L->data[j] = L->data[j + 1]; // 后面的数据依次往前移
    }
    // 覆盖写入到本地文件
    save_users(L,file_path,"w+",Line_Num-1);
    printf("删除成功!\n");
    // 长度减一
}

// 顺序表的遍历(从结构体中)：
void Prt(sq_list *L)
{
   
    printf("序号\t\t|名字\t\t|性别\t\t|年龄\t\t|学号\t\t|成绩\n");

    // 打印到终端,第一行不用打印
    for (int i = 0; i < Line_Num; i++)
    {
        printf("%d\t\t%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n", i + 1, L->data[i].name, L->data[i].sex, L->data[i].age, L->data[i].id, L->data[i].grade);
    }
}

// 拷贝顺序表L
sq_list *cp_sqlist(sq_list *L)
{
    // 创建一个新的结构体
    sq_list new_L;
    sq_list *L_copy = &new_L;
    Init_Sql_List(L_copy);
    L_copy->len = Line_Num; // 假设 L->len 是正确的长度
    for (int i = 0; i < Line_Num; i++)
    {
        L_copy->data[i] = L->data[i];
    }
    return L_copy;
    //测试
    printf("copy=%p\n", L_copy);
    // Prt(L_copy);
    //返回新的顺序表指针
}